package com.atguigu.ssyx.search.service.impl;

import com.atguigu.ssyx.activity.client.ActivityFeignCilent;
import com.atguigu.ssyx.client.prouduct.ProductFeignClient;
import com.atguigu.ssyx.common.auth.AuthContextHolder;
import com.atguigu.ssyx.enums.SkuType;
import com.atguigu.ssyx.model.product.Category;
import com.atguigu.ssyx.model.product.SkuInfo;
import com.atguigu.ssyx.model.search.SkuEs;
import com.atguigu.ssyx.search.repository.SkuRpository;
import com.atguigu.ssyx.search.service.SkuService;
import com.atguigu.ssyx.vo.search.SkuEsQueryVo;
import io.jsonwebtoken.lang.Collections;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.stream.Collectors;

@Service
@Slf4j
public class SkuserviceImpl implements SkuService {

    @Autowired
    private ProductFeignClient productFeignClient;
    @Autowired
    private SkuRpository skuRpository;

    @Autowired
    private ActivityFeignCilent activityFeignCilent;
    @Autowired

    private RedisTemplate redisTemplate;

    @Override
    public void upperSku(Long skuId) {
//        1.根据远程调用.根据skuID获得相关信息.

        log.info("upperSku：" + skuId);
//        获得分类信息.
        Category category = productFeignClient.getCategory(skuId);

        if (category == null) {
//            skuRpository.save(skuInfo);
            return;
        }
//        调用方法添加es.
        //查询sku信息

//获得产品信息.
        SkuInfo skuInfo = productFeignClient.getSkuInfo(skuId);
        if (null == skuInfo) return;


        SkuEs skuEs = new SkuEs();

        if (category != null) {
            skuEs.setCategoryId(category.getId());
            skuEs.setCategoryName(category.getName());
        }

        skuEs.setId(skuInfo.getId());

        skuEs.setKeyword(skuInfo.getSkuName() + "," + skuEs.getCategoryName());
        skuEs.setWareId(skuInfo.getWareId());
        skuEs.setIsNewPerson(skuInfo.getIsNewPerson());
        skuEs.setImgUrl(skuInfo.getImgUrl());
        skuEs.setTitle(skuInfo.getSkuName());
//        普通商品
        if (skuInfo.getSkuType() == SkuType.COMMON.getCode()) {
            skuEs.setSkuType(0);
            skuEs.setPrice(skuInfo.getPrice().doubleValue());
            skuEs.setStock(skuInfo.getStock());
            skuEs.setSale(skuInfo.getSale());
            skuEs.setPerLimit(skuInfo.getPerLimit());
        } else {
            //TODO 待完善-秒杀商品

        }
        skuRpository.save(skuEs);
    }

    @Override
    public void lowerSku(Long skuId) {
        skuRpository.deleteById(skuId);
    }

    //    获得爆款商品
    @Override
    public List<SkuEs> findHotSkuList() {
        Pageable of = PageRequest.of(0, 10);
//        find      read get开头
        Page<SkuEs> skuEsPage = skuRpository.findByOrderByHotScoreDesc(of);
        List<SkuEs> content = skuEsPage.getContent();
        return content;
    }

    /**
     * 这个是一个点击分类后显示商品.
     *
     * @param pageable
     * @param skuEsQueryVo
     * @return
     */
    @Override
    public List<SkuEs> search(Pageable pageable, SkuEsQueryVo skuEsQueryVo) {

//        心得:在线程中的空间有设置userID和wareId和
//                前端点击分类页面就到后端,之后就会查询es数据库了.

        Page<SkuEs> skuEsPage = null;

        skuEsQueryVo.setWareId(AuthContextHolder.getWareId());
        String keyword = skuEsQueryVo.getKeyword();
        if (StringUtils.isEmpty(keyword) || keyword == "") {
//            如果为空,就根据分类id和仓库id查询.
            skuEsPage = skuRpository.findByCategoryIdAndWareId(skuEsQueryVo.getCategoryId(), skuEsQueryVo.getWareId(), pageable);
//            where categoryId =? and wareId =?  limit 0, 10
        } else {
//            如果关键字不为空的话.
            skuEsQueryVo.setKeyword(keyword);
            skuEsPage = skuRpository.findByKeywordAndWareId(skuEsQueryVo.getKeyword(), skuEsQueryVo.getWareId(), pageable);
        }

//            1.根据远程调用.获得分类信息.

//        1.向skuEsQueryVo设置一个wareId,当前登录用户附近的仓库id.

//          2.进行查询. 使用springData.命名规则方法.进行条件查询.
//2.1   如果没有keyword的话,就用仓库id和分类id.
//2.2  如果都不为空,就都查询.


//      3.商品参加优惠活动.


//        获得查询的数据.
        List<SkuEs> skuEsList = skuEsPage.getContent();
//        collections是集合工具类
        if (!Collections.isEmpty(skuEsList)) {
//            拿到所有的skuId,查看他们的优惠活动.
            List<Long> skuIdList = skuEsList.stream().map(item -> item.getId()).collect(Collectors.toList());
//            远程调用出优惠信息.之后获得接口里面的信息.


//            返回Map信息,
//            这是参加了活动的id.
            Map<Long, List<String>> skuIdByRuleListMap = activityFeignCilent.findActivity(skuIdList);
//             Long是一个商品id,List<String>>是一个活动的优惠规则,

            if (skuIdByRuleListMap != null) {
//                说明其中有商品在参加活动.
                skuEsList.forEach(skuEs -> {
                    Long skuId = skuEs.getId();
                    List<String> ruleList = skuIdByRuleListMap.get(skuId);
                    if (ruleList != null) {
                        skuEs.setRuleList(ruleList);
                    }
                });

            }

        }


        return skuEsList;
    }

    @Override
    public void incrHotScore(Long skuId) {
        String key = "hotScore";
//        redis进行+1
//        aDouble这是加完后的值。
        Double aDouble = redisTemplate.opsForZSet().incrementScore(key, "skuId:" + skuId, 1);

        if (aDouble % 3 == 0) {
            Optional<SkuEs> byId = skuRpository.findById(skuId);
            SkuEs skuEs = byId.get();
//        之后进行进行规则判断

//        可以的话,修改进es的Hots
            skuEs.setHotScore(Math.round(aDouble));
//            如果有这个id的话就是更新，如果没有就是更新
            skuRpository.save(skuEs);
        }
    }

    @Test
    public void test1() {
        Pageable of = PageRequest.of(0, 10);
//        find      read get开头
        Page<SkuEs> skuEsPage = skuRpository.findByOrderByHotScoreDesc(of);
        System.out.println(skuRpository);
    }
}
